library(tidyverse)
library(dplyr)
library(readxl)
library(broom)
library(MuMIn)
library(lme4)
Pred <- read_csv("../data/predator.csv.gz",na = c("","n/a","NA"),col_types = cols(`SD PP`=col_double()))
problems(Pred)
colnames(Pred) <- gsub(" ", "_", colnames(Pred))
Pred 
Pred$Latitude <- Pred$Latitude %>% 
    sub("º", "d",.)
library(sp)
Pred$Latitude <- as.numeric(char2dms(Pred$Latitude))
Pred <- Pred %>%
mutate(Specific_habitat=gsub("Coastal bay", "Coastal Bay", Specific_habitat)) %>%
mutate(Specific_habitat=gsub("shelf", "Shelf", Specific_habitat))

pred_abundance dataset

This dataset is a subset of the marine dataset. What does it include?:

# pred_abundance <- Pred %>% 
#     group_by(Predator) %>% 
#     tally() %>% 
#     arrange(desc(n)) %>% 
#     filter(n > 800)
# pred_abundance
# 
# prey_abundance <- Pred %>% 
#    group_by(Prey) %>% 
#     tally() %>% 
#     arrange(desc(n)) %>% 
#     filter(n > 50 & n < 3000)
# prey_abundance
pred_prey_dataset <- Pred %>%
    # filter(Predator %in% pred_abundance$Predator) %>%
    # filter(Prey %in% prey_abundance$Prey) %>%
    # filter(Depth < 1000) %>%
    group_by(Predator_common_name, 
             Prey_common_name, 
             Specific_habitat, 
             Type_of_feeding_interaction, 
             Predator_lifestage, 
             Mean_PP,
             Mean_annual_temp,
             Depth) #%>%
   # summarise(Latitude = mean(Latitude),
   #           Predator_mass = mean(Predator_mass),
   #           Prey_mass = mean(Prey_mass),
   #           Depth = mean(Depth))
     
  
pred_prey_dataset

log predator mass vs log prey mass

As prey mass increases so does predator mass. When plotted this way, the data clusters into 4-5 blobs – it’s possible that there might be something underlying this pattern.

pred_prey_dataset %>% 
    ggplot(aes(x = log(Prey_mass), y = log(Predator_mass))) +
    geom_point() +
    geom_smooth(method = "glm") 

NA

Colour by specific habitat

Same plot, but now we colour data based on what habitat the predator-prey interaction is. It appears that habitat predicts the observed pattern… so what is it about habitat that underlies this pattern that as prey size increases so does predator size?

pred_prey_dataset %>% 
    ggplot(aes(x = log(Prey_mass), y = log(Predator_mass), colour = Specific_habitat)) +
    geom_point() 

# based on this graph, prey mass also appears to be smaller than predator mass for most of the time (1:1 line, maybe get a stat on this)

Colour by feeding interaction

Same plot, only we colour the data by the kind of feeding pattern the predator exhibits. It looks like this could also explain the data, although maybe not as strongly as habitat – you see that predacious feeding spans the extremes, and picsivorous feeding does too. But these are really general feeding types… are feeding types found in more habitats than in others?

pred_prey_dataset %>% 
    ggplot(aes(x = log(Predator_mass), y = log(Prey_mass), colour = Type_of_feeding_interaction)) +
    geom_point() 

Predacious data

predacious <- pred_prey_dataset %>% 
    filter(Type_of_feeding_interaction == 'predacious') %>% 
    select(Predator_mass, Prey_mass, Type_of_feeding_interaction, Prey_common_name, Specific_habitat) 
Adding missing grouping variables: `Predator_common_name`, `Predator_lifestage`, `Mean_PP`, `Mean_annual_temp`, `Depth`
   
predacious %>% 
    ggplot(aes(x = log(Prey_mass), y = log(Predator_mass), colour = Prey_common_name)) +
    geom_point()

# looking at the predacious data, there's two extremes:
# squid prey seem to make predator prey really big
# on the other hand, copepods and invertebrates appear to make predators really small
# an energy transfer issue? 
predacious %>% 
    ggplot(aes(x = log(Prey_mass), y = log(Predator_mass), colour = Specific_habitat)) +
    geom_point() 

# this might just be a function of the ice zone having a lot of observations, but being in the ice zone or nearshore makes you small, while living in the shelf makes you large
# in general, the slope of this looks almost the same as the previous graphs 

Planktivorous data

planktivorous <- pred_prey_dataset %>% 
    filter(Type_of_feeding_interaction == 'planktivorous') %>% 
    select(Predator_mass, Prey_mass, Type_of_feeding_interaction, Prey_common_name, Specific_habitat)
Adding missing grouping variables: `Predator_common_name`, `Predator_lifestage`, `Mean_PP`, `Mean_annual_temp`, `Depth`
planktivorous %>% 
    ggplot(aes(x = log(Prey_mass), y = log(Predator_mass), colour = Prey_common_name)) +
    geom_point() 

planktivorous %>% 
    ggplot(aes(x = log(Prey_mass), y = log(Predator_mass), colour = Specific_habitat)) +
    geom_point()

# all planktivorous species are found in the ice zone, and they're all really small
# slope increases quickly 

Piscivorous data

piscivorous <- pred_prey_dataset %>% 
    filter(Type_of_feeding_interaction == 'piscivorous') %>% 
    select(Predator_mass, Prey_mass, Type_of_feeding_interaction, Prey_common_name, Specific_habitat) 
Adding missing grouping variables: `Predator_common_name`, `Predator_lifestage`, `Mean_PP`, `Mean_annual_temp`, `Depth`
piscivorous %>% 
    ggplot(aes(x = log(Prey_mass), y = log(Predator_mass), colour = Prey_common_name)) +
    geom_point()

# You see some grouping here, it's a little more spaced out than what you saw for predacious, but there is definitely some grouping
piscivorous%>% 
    ggplot(aes(x = log(Prey_mass), y = log(Predator_mass), colour = Specific_habitat)) +
    geom_point()

# Specific habitat is also a really good indicator for prey size - predator size

Facet wrapping

pred_prey_dataset %>% 
    ggplot(aes(x = log(Prey_mass), y = log(Predator_mass), colour = "gray50")) +
    facet_wrap(~ Type_of_feeding_interaction+Specific_habitat ) +
    geom_point() +
    geom_smooth(method = 'glm', colour = 'black')

#ggsave("facetwrapping.jpg", width = 50, height = 40, units = "cm")

Some latitude stuff

Pred %>% 
    ggplot(aes(x = log(Prey_mass), y = log(Predator_mass), colour = abs(Latitude))) +
    geom_point(alpha = 0.3)

pred_prey_dataset %>% 
    ggplot(aes(x = log(Prey_mass), y = log(Predator_mass), colour = Predator_common_name)) +
    facet_grid(Specific_habitat ~ Type_of_feeding_interaction) +
    geom_point() +
    geom_smooth(method = 'glm', colour = 'black')

# ggsave("facetwrapping_adults.jpg", width = 50, height = 40, units = "cm")
pred_prey_dataset %>% 
    filter(Type_of_feeding_interaction == "planktivorous") %>% 
    ggplot(aes(x = log(Prey_mass), y = log(Predator_mass))) +
    facet_wrap(~ Specific_habitat) +
    geom_point() +
    geom_smooth(method = 'glm', colour = 'black')

# ggsave("facetwrappingplanktivorous.jpg", width = 50, height = 40, units = "cm")
pred_prey_dataset %>% 
    filter(Type_of_feeding_interaction == "piscivorous") %>% 
    ggplot(aes(x = log(Prey_mass), y = log(Predator_mass))) +
    facet_wrap(~ Specific_habitat) +
    geom_point() +
    geom_smooth(method = 'glm', colour = 'black')

# ggsave("facetwrappingpiscivorous.jpg", width = 50, height = 40, units = "cm")
pred_prey_dataset %>% 
    filter(Type_of_feeding_interaction == "predacious") %>% 
    ggplot(aes(x = log(Prey_mass), y = log(Predator_mass))) +
    facet_wrap(~ Specific_habitat) +
    geom_point() +
    geom_smooth(method = 'glm', colour = 'black')

# ggsave("facetwrappingpredacious.jpg", width = 50, height = 40, units = "cm")

Notes from meeting

Before we were thinking Prey and Predator have a really strong correlation but there’s nothing really here! (I think it’s moer like, depending on where you are, the correlation might be strong but not necessarily strong. But if we have to take some habitats out, it’d be interesting to hypothesize why the slopes of some these things change at different rates – could it be temperature? could it be depth?). Predator is strongly correlated with their habitat, which has its own depth. WHAT YOU EAT, AND WHERE YOU EAT affects the correlation between predator and prey mass. GLM: look at interactions between specific habitat, type of feeding interactions?? Only when we looked at generalist eaters did habitat

Predator-prey body mass ratios

# pred_prey_dataset %>%
#     mutate(PPMR = mean(Predator_mass/Prey_mass)) %>% 
#     group_by(Specific_habitat, PPMR) %>% 
#     select() %>% 
#     ggplot(aes(x = Specific_habitat, y = log(PPMR))) +
#     geom_col() +
#     theme(axis.text.x = element_text(angle=-45, hjust=0, vjust=1)) 
# Not really sure if this tells us anything -- I think it gives us the same information as the slope 
# ggsave("predator prey ratio.jpg", width = 15, height = 10, units = "cm")

OKAY PROJECT

Question: How do specific habitats affect predator-prey body size relationships? (specifically, how does it affect log prey mass (dependent variable)) - In other words, when log predator mass and log prey mass are plotted, what explains the variation in strength of the slope? - Is there an interaction effect with feeding type? With predator mass?

Predator-prey relationships

Same graphs again:

pred_prey_dataset %>% 
    ggplot(aes(x = log(Predator_mass), y = log(Prey_mass), colour = Specific_habitat)) +
    geom_point(size = 0.3) 

pred_prey_dataset %>% 
    ggplot(aes(x = log(Predator_mass), y = log(Prey_mass), colour = Type_of_feeding_interaction)) +
    geom_point(size = 0.3) 

# Prey mass = dependent variable
# Predator mass = independent variable: Brose et al. 2010 use Predator mass as the independent variable because there is less error in it than prey mass (prey are usually removed from predator guts, sometimes hard to identify exact species)
# are there other independent variables? do they interact?
# Question: how do you add a 1:1 line?
# fit some models to this graph: mixed effects, AIC
pred_prey_dataset %>% 
    group_by(Type_of_feeding_interaction) %>% 
    tally()
pred_prey_dataset %>% 
    group_by(Specific_habitat) %>% 
    tally()
# I don't think we need to worry about the lifestages of predators becauase in the dataset it distinguishes between what the predator eats depending on its lifestage
filtered_dataset <- pred_prey_dataset %>% 
    filter(Type_of_feeding_interaction != 'insectivorous' & Type_of_feeding_interaction != 'predacious/piscivorous') %>% 
    filter(Specific_habitat != 'Coastal, SW & SE Greenland' & Specific_habitat != 'inshore' & Specific_habitat != 'Nearshore waters')
filtered_dataset 
pred_prey_dataset %>% 
    ggplot(aes(x = log(Predator_mass), y = log(Prey_mass), colour = Geographic_location)) +
    geom_point(size = 0.1) +
    facet_wrap(~ Specific_habitat) +
    geom_smooth(method = 'glm', colour = 'black')

# I think the slope might tell you about the range of body sizes, as well as how prey body mass changes with predator body mass in different habitats
pred_prey_dataset %>%
    ggplot(aes(x = log(Predator_mass), y = log(Prey_mass), colour = Type_of_feeding_interaction)) +
    geom_point(size = 0.1) +
    facet_wrap(~ Type_of_feeding_interaction) +
    geom_smooth(method = 'glm', colour = 'black')

Model

library(lme4)
filtered_dataset <- Pred

Linear model 1

This model says: That for every habitat, predator and prey mass relationships have a different intercept (different starting point), and the effect is has on the slope of the relationship is also different in every habitat. Different slope and intercept for habitat.

lm1 <- lmer(log(Prey_mass) ~ 
                log(Predator_mass) + 
                (1 + log(Predator_mass)|Specific_habitat), 
            data = filtered_dataset)
summary(lm1)
Linear mixed model fit by REML ['lmerMod']
Formula: log(Prey_mass) ~ log(Predator_mass) + (1 + log(Predator_mass) |      Specific_habitat)
   Data: filtered_dataset

REML criterion at convergence: 153073.2

Scaled residuals: 
    Min      1Q  Median      3Q     Max 
-6.3008 -0.5303 -0.0086  0.6094  7.2546 

Random effects:
 Groups           Name               Variance Std.Dev. Corr 
 Specific_habitat (Intercept)        19.3577  4.3997        
                  log(Predator_mass)  0.3522  0.5934   -0.09
 Residual                             4.6589  2.1585        
Number of obs: 34931, groups:  Specific_habitat, 16

Fixed effects:
                   Estimate Std. Error t value
(Intercept)         -5.6893     1.1100  -5.125
log(Predator_mass)   0.9350     0.1564   5.977

Correlation of Fixed Effects:
            (Intr)
lg(Prdtr_m) -0.073
ranef(lm1)
$Specific_habitat
                                (Intercept) log(Predator_mass)
Coastal Bay                        2.341380        -0.07530835
Coastal, SW & SE Greenland         3.972445        -0.52946851
demersal food web                  3.055145        -0.12506006
estuary/coastal                   -1.296394         0.09789005
Euboikos and Pagassitikos Gulfs    3.326412         0.16178262
inshore                           -3.834071        -0.24624064
nearshore                         -3.566458         0.07125153
Nearshore waters                  -1.766406         0.33218159
Off the continental Shelf         -8.556339         0.61526105
offShelf and on Shelf              5.862114         1.56673981
open ocean                         6.563611        -0.97400337
Pelagic                            2.143563        -0.22433598
Seasonal Pack Ice Zone            -6.103949        -0.40220529
Shelf                              2.662171        -0.44925209
Shelfbreak/open ocean             -2.623919         0.15605431
transition region                 -2.179304         0.02471333
tidy(lm1,conf.int = T)

Linear model 2

Assuming different slopes and intercepts for different habitats and feeding types.

lm2 <- lmer(log(Prey_mass) ~ log(Predator_mass) + (1 + log(Predator_mass)|Specific_habitat) + (1 + log(Predator_mass)|Type_of_feeding_interaction), data = filtered_dataset)
Model failed to converge with max|grad| = 0.00435131 (tol = 0.002, component 1)
summary(lm2)
Linear mixed model fit by REML ['lmerMod']
Formula: log(Prey_mass) ~ log(Predator_mass) + (1 + log(Predator_mass) |  
    Specific_habitat) + (1 + log(Predator_mass) | Type_of_feeding_interaction)
   Data: filtered_dataset

REML criterion at convergence: 147365.2

Scaled residuals: 
    Min      1Q  Median      3Q     Max 
-6.3194 -0.5476 -0.0219  0.5822  7.7991 

Random effects:
 Groups                      Name               Variance Std.Dev. Corr 
 Specific_habitat            (Intercept)        19.89788 4.4607        
                             log(Predator_mass)  0.23696 0.4868   -0.45
 Type_of_feeding_interaction (Intercept)        13.34598 3.6532        
                             log(Predator_mass)  0.08867 0.2978   -1.00
 Residual                                        3.95383 1.9884        
Number of obs: 34931, groups:  Specific_habitat, 16; Type_of_feeding_interaction, 5

Fixed effects:
                   Estimate Std. Error t value
(Intercept)         -3.6919     1.9849  -1.860
log(Predator_mass)   0.6254     0.1852   3.377

Correlation of Fixed Effects:
            (Intr)
lg(Prdtr_m) -0.755
convergence code: 0
Model failed to converge with max|grad| = 0.00435131 (tol = 0.002, component 1)
ranef(lm2)
$Specific_habitat
                                (Intercept) log(Predator_mass)
Coastal Bay                      -1.0293509         0.29755926
Coastal, SW & SE Greenland        6.1464920        -0.57594667
demersal food web                -0.2824898         0.29260144
estuary/coastal                   0.2565448         0.11056859
Euboikos and Pagassitikos Gulfs   5.4190217        -0.32491524
inshore                          -2.1204955        -0.19863649
nearshore                        -2.6864370        -0.10068252
Nearshore waters                 -0.1168369         0.24763310
Off the continental Shelf       -11.2551676         0.99021699
offShelf and on Shelf             5.0467912         0.73851030
open ocean                        6.1654872        -0.80127036
Pelagic                           0.3748829         0.06539027
Seasonal Pack Ice Zone           -4.4886450        -0.41345763
Shelf                             0.8120864        -0.15514253
Shelfbreak/open ocean            -0.4423849         0.11321355
transition region                -1.7994984        -0.28564208

$Type_of_feeding_interaction
                       (Intercept) log(Predator_mass)
insectivorous             3.400200         -0.2771532
piscivorous               1.356042         -0.1105321
planktivorous            -4.227637          0.3445982
predacious               -3.559123          0.2901071
predacious/piscivorous    3.030518         -0.2470201
tidy(lm2,conf.int = T)
fitted_lm2 <- augment(lm2) 
Deprecated: please use `purrr::possibly()` insteadDeprecated: please use `purrr::possibly()` insteadDeprecated: please use `purrr::possibly()` insteadDeprecated: please use `purrr::possibly()` insteadDeprecated: please use `purrr::possibly()` instead
ggplot(fitted_lm2, aes(x = log.Predator_mass., y = .fixed, colour = Specific_habitat)) +
    geom_line() 

Linear model 4

Assume different intercepts and slope for every feeding type.

lm4 <- lmer(log(Prey_mass) ~ 
                log(Predator_mass) + 
                (1 + log(Predator_mass)|Type_of_feeding_interaction), data = filtered_dataset)
summary(lm4)
Linear mixed model fit by REML ['lmerMod']
Formula: log(Prey_mass) ~ log(Predator_mass) + (1 + log(Predator_mass) |      Type_of_feeding_interaction)
   Data: filtered_dataset

REML criterion at convergence: 164001.4

Scaled residuals: 
    Min      1Q  Median      3Q     Max 
-4.5174 -0.7705  0.0110  0.6977  5.3503 

Random effects:
 Groups                      Name               Variance Std.Dev. Corr 
 Type_of_feeding_interaction (Intercept)        19.5231  4.4185        
                             log(Predator_mass)  0.1109  0.3331   -0.89
 Residual                                        6.3949  2.5288        
Number of obs: 34931, groups:  Type_of_feeding_interaction, 5

Fixed effects:
                   Estimate Std. Error t value
(Intercept)         -4.3564     1.9858  -2.194
log(Predator_mass)   0.6226     0.1548   4.022

Correlation of Fixed Effects:
            (Intr)
lg(Prdtr_m) -0.870
ranef(lm4)
$Type_of_feeding_interaction
                       (Intercept) log(Predator_mass)
insectivorous             1.487633        -0.15095072
piscivorous               4.435092        -0.42096904
planktivorous            -5.438602         0.25633769
predacious               -3.829539         0.37805913
predacious/piscivorous    3.345416        -0.06247707
tidy(lm4,conf.int = T)

Possible interaction effect for habitat and feeding type. In model 7, the slope is affected by the interaction btween habitat type and feeding type.

# #library(lme4)
# 
# #summary(lm7)
# ranef(lm7)
# tidy(lm7,conf.int = T)
# fitted_lm7 <- augment(lm7) 
# names(fitted_lm7)
#     ggplot(fitted_lm7, aes(x = log.Predator_mass., y = .fixed, colour = Specific_habitat)) +
#     geom_line() #+
#         #facet_grid(~ Specific_habitat)

AIC

library(MuMIn)
#model.sel(lm1, lm2, lm4, lm9, lm10, lm11,null, lm12, rank = AIC)

Take out model 5 – assumption doens’t make sense.

lm9 <- lmer(log(Prey_mass) ~ log(Predator_mass) + (1 | Type_of_feeding_interaction) + (1 | Type_of_feeding_interaction:Specific_habitat), data = filtered_dataset)
lm10 <- lmer(log(Prey_mass) ~ log(Predator_mass) + (1 + log(Predator_mass) | Type_of_feeding_interaction) + (1 + log(Predator_mass)| Type_of_feeding_interaction:Specific_habitat), data = filtered_dataset)
lm11 <- lmer(log(Prey_mass) ~ log(Predator_mass) + (1 + log(Predator_mass) | Specific_habitat) + (1 + log(Predator_mass)| Specific_habitat:Type_of_feeding_interaction), data = filtered_dataset)
# fitted_lm11 <- augment(lm11) 
# fitted_lm11
#     ggplot(nulllm11, aes(x = log.Predator_mass., y = .fitted)) +
#     geom_line(aes(colour = Specific_habitat))+facet_grid(~ Type_of_feeding_interaction) + null_line
# 
#MOVED THIS CODE TO THE BOTTOM BECAUSE NULLlm11 is at bottom
# fitdata11 <- ranef(lm11)[[1]] %>% 
#     rownames_to_column()%>% as_data_frame() %>% 
#     separate(rowname, into = c("habitat","feeding_type"), sep = ":") 
# colnames(fitdata11)[4] <- c("slope")
# fitdata11 %>% 
#     ggplot()+
#     geom_point(aes(x = feeding_type, y = fixef(lm11)[[2]] + slope,color = habitat) ) + 
#     geom_hline(yintercept = tidy(null)[2,2])
lm12 <- lmer(log(Prey_mass) ~ log(Predator_mass) + (1 + log(Predator_mass) | Specific_habitat) + (1 + log(Predator_mass)| Specific_habitat:Type_of_feeding_interaction) + (1 + log(Predator_mass)| Type_of_feeding_interaction), data = filtered_dataset)
# 
# fitdata12 <- ranef(lm12)[[1]] %>% 
#     rownames_to_column()%>% as_data_frame() %>% 
#     separate(rowname, into = c("habitat","feeding_type"), sep = ":") 
# colnames(fitdata12)[4] <- c("slope")
# fitdata12 %>% 
#     ggplot()+
#     geom_point(aes(x = feeding_type, y = fixef(lm12)[[2]] + slope,color = habitat) ) + 
#     geom_hline(yintercept = tidy(null)[2,2])
#model.sel(lm1, lm2, lm4, lm9, lm10, lm11,null, lm12, rank = AIC)
#anova(lm1, lm2, lm4, lm9, lm10, lm11,null, lm12)
#anova( lm9, lm10, lm11, lm12)
fitted_lm11 <- augment(lm11) 
Deprecated: please use `purrr::possibly()` insteadDeprecated: please use `purrr::possibly()` insteadDeprecated: please use `purrr::possibly()` insteadDeprecated: please use `purrr::possibly()` insteadDeprecated: please use `purrr::possibly()` instead
null <- glm(log(Prey_mass) ~ log(Predator_mass),data = filtered_dataset) 
fitted_null <- augment(null) %>% 
    rename(.fitted_null = .fitted)
Deprecated: please use `purrr::possibly()` insteadDeprecated: please use `purrr::possibly()` insteadDeprecated: please use `purrr::possibly()` insteadDeprecated: please use `purrr::possibly()` insteadDeprecated: please use `purrr::possibly()` instead
names(fitted_null)
[1] "log.Prey_mass."     "log.Predator_mass." ".fitted_null"       ".se.fit"            ".resid"             ".hat"              
[7] ".sigma"             ".cooksd"            ".std.resid"        
null_line <- geom_line(aes(x = log.Predator_mass., y = .fitted_null))
nulllm11 <- bind_cols(fitted_lm11, fitted_null)
fitted_lm11
    ggplot(nulllm11, aes(x = log.Predator_mass., y = .fitted)) +
    geom_line(aes(colour = Specific_habitat))+facet_grid(~ Type_of_feeding_interaction) + null_line

fitdata11 <- ranef(lm11)[[1]] %>% 
    rownames_to_column()%>% as_data_frame() %>% 
    separate(rowname, into = c("habitat","feeding_type"), sep = ":") 
colnames(fitdata11)[4] <- c("slope")
fitdata11 %>% 
    ggplot()+
    geom_point(aes(x = feeding_type, y = fixef(lm11)[[2]] + slope,color = habitat) ) + 
    geom_hline(yintercept = tidy(null)[2,2])

fitdata12 <- ranef(lm12)[[1]] %>% 
    rownames_to_column()%>% as_data_frame() %>% 
    separate(rowname, into = c("habitat","feeding_type"), sep = ":") 
colnames(fitdata12)[4] <- c("slope")
fitdata12 %>% 
    ggplot()+
    geom_point(aes(x = feeding_type, y = fixef(lm12)[[2]] + slope,color = habitat) ) + 
    geom_hline(yintercept = tidy(null)[2,2])

model.sel(lm1, lm2, lm4, lm9, lm10, lm11,null, lm12, rank = AIC)
Model selection table 
      (Int) log(Prd_mss)   class                                             random df    logLik      AIC    delta weight
lm12 -4.639       0.8521 lmerMod 1+l(P_m)|S_h+1+l(P_m)|S_h:T_o_f_i+1+l(P_m)|T_o_f_i 12 -72661.25 145346.5     0.00  0.740
lm11 -5.479       0.8311 lmerMod                  1+l(P_m)|S_h+1+l(P_m)|S_h:T_o_f_i  9 -72665.30 145348.6     2.10  0.259
lm10 -5.584       0.7093 lmerMod              1+l(P_m)|T_o_f_i+1+l(P_m)|T_o_f_i:S_h  9 -72670.70 145359.4    12.88  0.001
lm9  -5.532       0.7192 lmerMod                                T_o_f_i+T_o_f_i:S_h  5 -73533.87 147077.7  1731.23  0.000
lm2  -3.692       0.6254 lmerMod                      1+l(P_m)|S_h+1+l(P_m)|T_o_f_i  9 -73682.61 147383.2  2036.72  0.000
lm1  -5.689       0.9350 lmerMod                                       1+l(P_m)|S_h  6 -76536.60 153085.2  7738.69  0.000
lm4  -4.356       0.6226 lmerMod                                   1+l(P_m)|T_o_f_i  6 -82000.71 164013.4 18666.92  0.000
null -6.947       0.9966     glm                                                     3 -89077.81 178161.6 32815.11  0.000
Models ranked by AIC(x) 
Random terms: 
1+l(P_m)|S_h = ‘1 + log(Predator_mass) | Specific_habitat’
1+l(P_m)|S_h:T_o_f_i = ‘1 + log(Predator_mass) | Specific_habitat:Type_of_feeding_interaction’
1+l(P_m)|T_o_f_i = ‘1 + log(Predator_mass) | Type_of_feeding_interaction’
1+l(P_m)|T_o_f_i:S_h = ‘1 + log(Predator_mass) | Type_of_feeding_interaction:Specific_habitat’
T_o_f_i = ‘1 | Type_of_feeding_interaction’
T_o_f_i:S_h = ‘1 | Type_of_feeding_interaction:Specific_habitat’
anova(lm1, lm2, lm4, lm9, lm10, lm11,null, lm12)
refitting model(s) with ML (instead of REML)
LS0tDQp0aXRsZTogIlIgTm90ZWJvb2siDQpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sNCi0tLQ0KDQpgYGB7cn0NCmxpYnJhcnkodGlkeXZlcnNlKQ0KbGlicmFyeShkcGx5cikNCmxpYnJhcnkocmVhZHhsKQ0KbGlicmFyeShicm9vbSkNCmxpYnJhcnkoTXVNSW4pDQpsaWJyYXJ5KGxtZTQpDQpgYGANCg0KYGBge3J9ICAgICAgICAgICAgICAgICAgICAgIA0KUHJlZCA8LSByZWFkX2NzdigiLi4vZGF0YS9wcmVkYXRvci5jc3YuZ3oiLG5hID0gYygiIiwibi9hIiwiTkEiKSxjb2xfdHlwZXMgPSBjb2xzKGBTRCBQUGA9Y29sX2RvdWJsZSgpKSkNCnByb2JsZW1zKFByZWQpDQpgYGANCg0KYGBge3J9DQpjb2xuYW1lcyhQcmVkKSA8LSBnc3ViKCIgIiwgIl8iLCBjb2xuYW1lcyhQcmVkKSkNCmBgYA0KDQoNCmBgYHtyfQ0KUHJlZCANCg0KUHJlZCRMYXRpdHVkZSA8LSBQcmVkJExhdGl0dWRlICU+JSANCiAgICBzdWIoIsK6IiwgImQiLC4pDQoNCmxpYnJhcnkoc3ApDQpQcmVkJExhdGl0dWRlIDwtIGFzLm51bWVyaWMoY2hhcjJkbXMoUHJlZCRMYXRpdHVkZSkpDQoNCmBgYA0KYGBge3J9DQpQcmVkIDwtIFByZWQgJT4lDQptdXRhdGUoU3BlY2lmaWNfaGFiaXRhdD1nc3ViKCJDb2FzdGFsIGJheSIsICJDb2FzdGFsIEJheSIsIFNwZWNpZmljX2hhYml0YXQpKSAlPiUNCm11dGF0ZShTcGVjaWZpY19oYWJpdGF0PWdzdWIoInNoZWxmIiwgIlNoZWxmIiwgU3BlY2lmaWNfaGFiaXRhdCkpDQpgYGANCg0KIyBwcmVkX2FidW5kYW5jZSBkYXRhc2V0IA0KDQpUaGlzIGRhdGFzZXQgaXMgYSBzdWJzZXQgb2YgdGhlIG1hcmluZSBkYXRhc2V0LiBXaGF0IGRvZXMgaXQgaW5jbHVkZT86IA0KYGBge3J9DQojIHByZWRfYWJ1bmRhbmNlIDwtIFByZWQgJT4lIA0KIyAgICAgZ3JvdXBfYnkoUHJlZGF0b3IpICU+JSANCiMgICAgIHRhbGx5KCkgJT4lIA0KIyAgICAgYXJyYW5nZShkZXNjKG4pKSAlPiUgDQojICAgICBmaWx0ZXIobiA+IDgwMCkNCiMgcHJlZF9hYnVuZGFuY2UNCiMgDQojIHByZXlfYWJ1bmRhbmNlIDwtIFByZWQgJT4lIA0KIyAgICBncm91cF9ieShQcmV5KSAlPiUgDQojICAgICB0YWxseSgpICU+JSANCiMgICAgIGFycmFuZ2UoZGVzYyhuKSkgJT4lIA0KIyAgICAgZmlsdGVyKG4gPiA1MCAmIG4gPCAzMDAwKQ0KIyBwcmV5X2FidW5kYW5jZQ0KDQpwcmVkX3ByZXlfZGF0YXNldCA8LSBQcmVkICU+JQ0KICAgICMgZmlsdGVyKFByZWRhdG9yICVpbiUgcHJlZF9hYnVuZGFuY2UkUHJlZGF0b3IpICU+JQ0KICAgICMgZmlsdGVyKFByZXkgJWluJSBwcmV5X2FidW5kYW5jZSRQcmV5KSAlPiUNCiAgICAjIGZpbHRlcihEZXB0aCA8IDEwMDApICU+JQ0KICAgIGdyb3VwX2J5KFByZWRhdG9yX2NvbW1vbl9uYW1lLCANCiAgICAgICAgICAgICBQcmV5X2NvbW1vbl9uYW1lLCANCiAgICAgICAgICAgICBTcGVjaWZpY19oYWJpdGF0LCANCiAgICAgICAgICAgICBUeXBlX29mX2ZlZWRpbmdfaW50ZXJhY3Rpb24sIA0KICAgICAgICAgICAgIFByZWRhdG9yX2xpZmVzdGFnZSwgDQogICAgICAgICAgICAgTWVhbl9QUCwNCiAgICAgICAgICAgICBNZWFuX2FubnVhbF90ZW1wLA0KICAgICAgICAgICAgIERlcHRoKSAjJT4lDQogICAjIHN1bW1hcmlzZShMYXRpdHVkZSA9IG1lYW4oTGF0aXR1ZGUpLA0KICAgIyAgICAgICAgICAgUHJlZGF0b3JfbWFzcyA9IG1lYW4oUHJlZGF0b3JfbWFzcyksDQogICAjICAgICAgICAgICBQcmV5X21hc3MgPSBtZWFuKFByZXlfbWFzcyksDQogICAjICAgICAgICAgICBEZXB0aCA9IG1lYW4oRGVwdGgpKQ0KICAgICANCiAgDQpwcmVkX3ByZXlfZGF0YXNldA0KDQoNCmBgYA0KDQojIGxvZyBwcmVkYXRvciBtYXNzIHZzIGxvZyBwcmV5IG1hc3MNCg0KQXMgcHJleSBtYXNzIGluY3JlYXNlcyBzbyBkb2VzIHByZWRhdG9yIG1hc3MuIFdoZW4gcGxvdHRlZCB0aGlzIHdheSwgdGhlIGRhdGEgY2x1c3RlcnMgaW50byA0LTUgYmxvYnMgLS0gaXQncyBwb3NzaWJsZSB0aGF0IHRoZXJlIG1pZ2h0IGJlIHNvbWV0aGluZyB1bmRlcmx5aW5nIHRoaXMgcGF0dGVybi4gDQoNCmBgYHtyfQ0KcHJlZF9wcmV5X2RhdGFzZXQgJT4lIA0KICAgIGdncGxvdChhZXMoeCA9IGxvZyhQcmV5X21hc3MpLCB5ID0gbG9nKFByZWRhdG9yX21hc3MpKSkgKw0KICAgIGdlb21fcG9pbnQoKSArDQogICAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImdsbSIpIA0KICANCg0KYGBgDQoNCiMgQ29sb3VyIGJ5IHNwZWNpZmljIGhhYml0YXQNCg0KU2FtZSBwbG90LCBidXQgbm93IHdlIGNvbG91ciBkYXRhIGJhc2VkIG9uIHdoYXQgaGFiaXRhdCB0aGUgcHJlZGF0b3ItcHJleSBpbnRlcmFjdGlvbiBpcy4gDQpJdCBhcHBlYXJzIHRoYXQgaGFiaXRhdCBwcmVkaWN0cyB0aGUgb2JzZXJ2ZWQgcGF0dGVybi4uLiBzbyB3aGF0IGlzIGl0IGFib3V0IGhhYml0YXQgdGhhdCB1bmRlcmxpZXMgdGhpcyBwYXR0ZXJuIHRoYXQgYXMgcHJleSBzaXplIGluY3JlYXNlcyBzbyBkb2VzIHByZWRhdG9yIHNpemU/DQpgYGB7ciwgZmlnLndpZHRoPTcsIGZpZy5oZWlnaHQ9NH0NCnByZWRfcHJleV9kYXRhc2V0ICU+JSANCiAgICBnZ3Bsb3QoYWVzKHggPSBsb2coUHJleV9tYXNzKSwgeSA9IGxvZyhQcmVkYXRvcl9tYXNzKSwgY29sb3VyID0gU3BlY2lmaWNfaGFiaXRhdCkpICsNCiAgICBnZW9tX3BvaW50KCkgDQoNCiMgYmFzZWQgb24gdGhpcyBncmFwaCwgcHJleSBtYXNzIGFsc28gYXBwZWFycyB0byBiZSBzbWFsbGVyIHRoYW4gcHJlZGF0b3IgbWFzcyBmb3IgbW9zdCBvZiB0aGUgdGltZSAoMToxIGxpbmUsIG1heWJlIGdldCBhIHN0YXQgb24gdGhpcykNCmBgYA0KIyBDb2xvdXIgYnkgZmVlZGluZyBpbnRlcmFjdGlvbg0KDQpTYW1lIHBsb3QsIG9ubHkgd2UgY29sb3VyIHRoZSBkYXRhIGJ5IHRoZSBraW5kIG9mIGZlZWRpbmcgcGF0dGVybiB0aGUgcHJlZGF0b3IgZXhoaWJpdHMuIA0KSXQgbG9va3MgbGlrZSB0aGlzIGNvdWxkIGFsc28gZXhwbGFpbiB0aGUgZGF0YSwgYWx0aG91Z2ggbWF5YmUgbm90IGFzIHN0cm9uZ2x5IGFzIGhhYml0YXQgLS0geW91IHNlZSB0aGF0IHByZWRhY2lvdXMgZmVlZGluZyBzcGFucyB0aGUgZXh0cmVtZXMsIGFuZCBwaWNzaXZvcm91cyBmZWVkaW5nIGRvZXMgdG9vLiBCdXQgdGhlc2UgYXJlIHJlYWxseSBnZW5lcmFsIGZlZWRpbmcgdHlwZXMuLi4gYXJlIGZlZWRpbmcgdHlwZXMgZm91bmQgaW4gbW9yZSBoYWJpdGF0cyB0aGFuIGluIG90aGVycz8gDQoNCmBgYHtyLCBmaWcud2lkdGg9NywgZmlnLmhlaWdodD00fQ0KcHJlZF9wcmV5X2RhdGFzZXQgJT4lIA0KICAgIGdncGxvdChhZXMoeCA9IGxvZyhQcmVkYXRvcl9tYXNzKSwgeSA9IGxvZyhQcmV5X21hc3MpLCBjb2xvdXIgPSBUeXBlX29mX2ZlZWRpbmdfaW50ZXJhY3Rpb24pKSArDQogICAgZ2VvbV9wb2ludCgpIA0KYGBgDQoNCiMgUHJlZGFjaW91cyBkYXRhDQoNCmBgYHtyLCBmaWcud2lkdGg9NywgZmlnLmhlaWdodD00fQ0KDQpwcmVkYWNpb3VzIDwtIHByZWRfcHJleV9kYXRhc2V0ICU+JSANCiAgICBmaWx0ZXIoVHlwZV9vZl9mZWVkaW5nX2ludGVyYWN0aW9uID09ICdwcmVkYWNpb3VzJykgJT4lIA0KICAgIHNlbGVjdChQcmVkYXRvcl9tYXNzLCBQcmV5X21hc3MsIFR5cGVfb2ZfZmVlZGluZ19pbnRlcmFjdGlvbiwgUHJleV9jb21tb25fbmFtZSwgU3BlY2lmaWNfaGFiaXRhdCkgDQogICANCnByZWRhY2lvdXMgJT4lIA0KICAgIGdncGxvdChhZXMoeCA9IGxvZyhQcmV5X21hc3MpLCB5ID0gbG9nKFByZWRhdG9yX21hc3MpLCBjb2xvdXIgPSBQcmV5X2NvbW1vbl9uYW1lKSkgKw0KICAgIGdlb21fcG9pbnQoKQ0KDQojIGxvb2tpbmcgYXQgdGhlIHByZWRhY2lvdXMgZGF0YSwgdGhlcmUncyB0d28gZXh0cmVtZXM6DQojIHNxdWlkIHByZXkgc2VlbSB0byBtYWtlIHByZWRhdG9yIHByZXkgcmVhbGx5IGJpZw0KIyBvbiB0aGUgb3RoZXIgaGFuZCwgY29wZXBvZHMgYW5kIGludmVydGVicmF0ZXMgYXBwZWFyIHRvIG1ha2UgcHJlZGF0b3JzIHJlYWxseSBzbWFsbA0KIyBhbiBlbmVyZ3kgdHJhbnNmZXIgaXNzdWU/IA0KDQpwcmVkYWNpb3VzICU+JSANCiAgICBnZ3Bsb3QoYWVzKHggPSBsb2coUHJleV9tYXNzKSwgeSA9IGxvZyhQcmVkYXRvcl9tYXNzKSwgY29sb3VyID0gU3BlY2lmaWNfaGFiaXRhdCkpICsNCiAgICBnZW9tX3BvaW50KCkgDQoNCiMgdGhpcyBtaWdodCBqdXN0IGJlIGEgZnVuY3Rpb24gb2YgdGhlIGljZSB6b25lIGhhdmluZyBhIGxvdCBvZiBvYnNlcnZhdGlvbnMsIGJ1dCBiZWluZyBpbiB0aGUgaWNlIHpvbmUgb3IgbmVhcnNob3JlIG1ha2VzIHlvdSBzbWFsbCwgd2hpbGUgbGl2aW5nIGluIHRoZSBzaGVsZiBtYWtlcyB5b3UgbGFyZ2UNCg0KIyBpbiBnZW5lcmFsLCB0aGUgc2xvcGUgb2YgdGhpcyBsb29rcyBhbG1vc3QgdGhlIHNhbWUgYXMgdGhlIHByZXZpb3VzIGdyYXBocyANCg0KYGBgDQoNCiMgUGxhbmt0aXZvcm91cyBkYXRhDQogDQpgYGB7cn0NCnBsYW5rdGl2b3JvdXMgPC0gcHJlZF9wcmV5X2RhdGFzZXQgJT4lIA0KICAgIGZpbHRlcihUeXBlX29mX2ZlZWRpbmdfaW50ZXJhY3Rpb24gPT0gJ3BsYW5rdGl2b3JvdXMnKSAlPiUgDQogICAgc2VsZWN0KFByZWRhdG9yX21hc3MsIFByZXlfbWFzcywgVHlwZV9vZl9mZWVkaW5nX2ludGVyYWN0aW9uLCBQcmV5X2NvbW1vbl9uYW1lLCBTcGVjaWZpY19oYWJpdGF0KQ0KDQpwbGFua3Rpdm9yb3VzICU+JSANCiAgICBnZ3Bsb3QoYWVzKHggPSBsb2coUHJleV9tYXNzKSwgeSA9IGxvZyhQcmVkYXRvcl9tYXNzKSwgY29sb3VyID0gUHJleV9jb21tb25fbmFtZSkpICsNCiAgICBnZW9tX3BvaW50KCkgDQoNCnBsYW5rdGl2b3JvdXMgJT4lIA0KICAgIGdncGxvdChhZXMoeCA9IGxvZyhQcmV5X21hc3MpLCB5ID0gbG9nKFByZWRhdG9yX21hc3MpLCBjb2xvdXIgPSBTcGVjaWZpY19oYWJpdGF0KSkgKw0KICAgIGdlb21fcG9pbnQoKQ0KDQojIGFsbCBwbGFua3Rpdm9yb3VzIHNwZWNpZXMgYXJlIGZvdW5kIGluIHRoZSBpY2Ugem9uZSwgYW5kIHRoZXkncmUgYWxsIHJlYWxseSBzbWFsbA0KIyBzbG9wZSBpbmNyZWFzZXMgcXVpY2tseSANCg0KDQpgYGANCg0KIyBQaXNjaXZvcm91cyBkYXRhDQoNCmBgYHtyLCBmaWcud2lkdGg9NywgZmlnLmhlaWdodD00fQ0KcGlzY2l2b3JvdXMgPC0gcHJlZF9wcmV5X2RhdGFzZXQgJT4lIA0KICAgIGZpbHRlcihUeXBlX29mX2ZlZWRpbmdfaW50ZXJhY3Rpb24gPT0gJ3Bpc2Npdm9yb3VzJykgJT4lIA0KICAgIHNlbGVjdChQcmVkYXRvcl9tYXNzLCBQcmV5X21hc3MsIFR5cGVfb2ZfZmVlZGluZ19pbnRlcmFjdGlvbiwgUHJleV9jb21tb25fbmFtZSwgU3BlY2lmaWNfaGFiaXRhdCkgDQoNCnBpc2Npdm9yb3VzICU+JSANCiAgICBnZ3Bsb3QoYWVzKHggPSBsb2coUHJleV9tYXNzKSwgeSA9IGxvZyhQcmVkYXRvcl9tYXNzKSwgY29sb3VyID0gUHJleV9jb21tb25fbmFtZSkpICsNCiAgICBnZW9tX3BvaW50KCkNCg0KIyBZb3Ugc2VlIHNvbWUgZ3JvdXBpbmcgaGVyZSwgaXQncyBhIGxpdHRsZSBtb3JlIHNwYWNlZCBvdXQgdGhhbiB3aGF0IHlvdSBzYXcgZm9yIHByZWRhY2lvdXMsIGJ1dCB0aGVyZSBpcyBkZWZpbml0ZWx5IHNvbWUgZ3JvdXBpbmcNCg0KcGlzY2l2b3JvdXMlPiUgDQogICAgZ2dwbG90KGFlcyh4ID0gbG9nKFByZXlfbWFzcyksIHkgPSBsb2coUHJlZGF0b3JfbWFzcyksIGNvbG91ciA9IFNwZWNpZmljX2hhYml0YXQpKSArDQogICAgZ2VvbV9wb2ludCgpDQoNCiMgU3BlY2lmaWMgaGFiaXRhdCBpcyBhbHNvIGEgcmVhbGx5IGdvb2QgaW5kaWNhdG9yIGZvciBwcmV5IHNpemUgLSBwcmVkYXRvciBzaXplDQpgYGANCg0KIyBGYWNldCB3cmFwcGluZw0KDQpgYGB7ciwgZmlnLndpZHRoPTcsIGZpZy5oZWlnaHQ9MTB9DQpwcmVkX3ByZXlfZGF0YXNldCAlPiUgDQogICAgZ2dwbG90KGFlcyh4ID0gbG9nKFByZXlfbWFzcyksIHkgPSBsb2coUHJlZGF0b3JfbWFzcyksIGNvbG91ciA9ICJncmF5NTAiKSkgKw0KICAgIGZhY2V0X3dyYXAofiBUeXBlX29mX2ZlZWRpbmdfaW50ZXJhY3Rpb24rU3BlY2lmaWNfaGFiaXRhdCApICsNCiAgICBnZW9tX3BvaW50KCkgKw0KICAgIGdlb21fc21vb3RoKG1ldGhvZCA9ICdnbG0nLCBjb2xvdXIgPSAnYmxhY2snKQ0KDQojZ2dzYXZlKCJmYWNldHdyYXBwaW5nLmpwZyIsIHdpZHRoID0gNTAsIGhlaWdodCA9IDQwLCB1bml0cyA9ICJjbSIpDQpgYGANCg0KIyBTb21lIGxhdGl0dWRlIHN0dWZmDQoNCmBgYHtyfQ0KUHJlZCAlPiUgDQogICAgZ2dwbG90KGFlcyh4ID0gbG9nKFByZXlfbWFzcyksIHkgPSBsb2coUHJlZGF0b3JfbWFzcyksIGNvbG91ciA9IGFicyhMYXRpdHVkZSkpKSArDQogICAgZ2VvbV9wb2ludChhbHBoYSA9IDAuMykNCmBgYA0KDQpgYGB7cn0NCnByZWRfcHJleV9kYXRhc2V0ICU+JSANCiAgICBnZ3Bsb3QoYWVzKHggPSBsb2coUHJleV9tYXNzKSwgeSA9IGxvZyhQcmVkYXRvcl9tYXNzKSwgY29sb3VyID0gUHJlZGF0b3JfY29tbW9uX25hbWUpKSArDQogICAgZmFjZXRfZ3JpZChTcGVjaWZpY19oYWJpdGF0IH4gVHlwZV9vZl9mZWVkaW5nX2ludGVyYWN0aW9uKSArDQogICAgZ2VvbV9wb2ludCgpICsNCiAgICBnZW9tX3Ntb290aChtZXRob2QgPSAnZ2xtJywgY29sb3VyID0gJ2JsYWNrJykNCg0KIyBnZ3NhdmUoImZhY2V0d3JhcHBpbmdfYWR1bHRzLmpwZyIsIHdpZHRoID0gNTAsIGhlaWdodCA9IDQwLCB1bml0cyA9ICJjbSIpDQoNCg0KYGBgDQoNCmBgYHtyfQ0KcHJlZF9wcmV5X2RhdGFzZXQgJT4lIA0KICAgIGZpbHRlcihUeXBlX29mX2ZlZWRpbmdfaW50ZXJhY3Rpb24gPT0gInBsYW5rdGl2b3JvdXMiKSAlPiUgDQogICAgZ2dwbG90KGFlcyh4ID0gbG9nKFByZXlfbWFzcyksIHkgPSBsb2coUHJlZGF0b3JfbWFzcykpKSArDQogICAgZmFjZXRfd3JhcCh+IFNwZWNpZmljX2hhYml0YXQpICsNCiAgICBnZW9tX3BvaW50KCkgKw0KICAgIGdlb21fc21vb3RoKG1ldGhvZCA9ICdnbG0nLCBjb2xvdXIgPSAnYmxhY2snKQ0KDQojIGdnc2F2ZSgiZmFjZXR3cmFwcGluZ3BsYW5rdGl2b3JvdXMuanBnIiwgd2lkdGggPSA1MCwgaGVpZ2h0ID0gNDAsIHVuaXRzID0gImNtIikNCmBgYA0KDQpgYGB7cn0NCnByZWRfcHJleV9kYXRhc2V0ICU+JSANCiAgICBmaWx0ZXIoVHlwZV9vZl9mZWVkaW5nX2ludGVyYWN0aW9uID09ICJwaXNjaXZvcm91cyIpICU+JSANCiAgICBnZ3Bsb3QoYWVzKHggPSBsb2coUHJleV9tYXNzKSwgeSA9IGxvZyhQcmVkYXRvcl9tYXNzKSkpICsNCiAgICBmYWNldF93cmFwKH4gU3BlY2lmaWNfaGFiaXRhdCkgKw0KICAgIGdlb21fcG9pbnQoKSArDQogICAgZ2VvbV9zbW9vdGgobWV0aG9kID0gJ2dsbScsIGNvbG91ciA9ICdibGFjaycpDQoNCiMgZ2dzYXZlKCJmYWNldHdyYXBwaW5ncGlzY2l2b3JvdXMuanBnIiwgd2lkdGggPSA1MCwgaGVpZ2h0ID0gNDAsIHVuaXRzID0gImNtIikNCmBgYA0KDQpgYGB7cn0NCnByZWRfcHJleV9kYXRhc2V0ICU+JSANCiAgICBmaWx0ZXIoVHlwZV9vZl9mZWVkaW5nX2ludGVyYWN0aW9uID09ICJwcmVkYWNpb3VzIikgJT4lIA0KICAgIGdncGxvdChhZXMoeCA9IGxvZyhQcmV5X21hc3MpLCB5ID0gbG9nKFByZWRhdG9yX21hc3MpKSkgKw0KICAgIGZhY2V0X3dyYXAofiBTcGVjaWZpY19oYWJpdGF0KSArDQogICAgZ2VvbV9wb2ludCgpICsNCiAgICBnZW9tX3Ntb290aChtZXRob2QgPSAnZ2xtJywgY29sb3VyID0gJ2JsYWNrJykNCg0KIyBnZ3NhdmUoImZhY2V0d3JhcHBpbmdwcmVkYWNpb3VzLmpwZyIsIHdpZHRoID0gNTAsIGhlaWdodCA9IDQwLCB1bml0cyA9ICJjbSIpDQpgYGANCg0KDQojIE5vdGVzIGZyb20gbWVldGluZw0KDQpCZWZvcmUgd2Ugd2VyZSB0aGlua2luZyBQcmV5IGFuZCBQcmVkYXRvciBoYXZlIGEgcmVhbGx5IHN0cm9uZyBjb3JyZWxhdGlvbiBidXQgdGhlcmUncyBub3RoaW5nIHJlYWxseSBoZXJlISAoSSB0aGluayBpdCdzIG1vZXIgbGlrZSwgZGVwZW5kaW5nIG9uIHdoZXJlIHlvdSBhcmUsIHRoZSBjb3JyZWxhdGlvbiBtaWdodCBiZSBzdHJvbmcgYnV0IG5vdCBuZWNlc3NhcmlseSBzdHJvbmcuIEJ1dCBpZiB3ZSBoYXZlIHRvIHRha2Ugc29tZSBoYWJpdGF0cyBvdXQsIGl0J2QgYmUgaW50ZXJlc3RpbmcgdG8gaHlwb3RoZXNpemUgd2h5IHRoZSBzbG9wZXMgb2Ygc29tZSB0aGVzZSB0aGluZ3MgY2hhbmdlIGF0IGRpZmZlcmVudCByYXRlcyAtLSBjb3VsZCBpdCBiZSB0ZW1wZXJhdHVyZT8gY291bGQgaXQgYmUgZGVwdGg/KS4gDQpQcmVkYXRvciBpcyBzdHJvbmdseSBjb3JyZWxhdGVkIHdpdGggdGhlaXIgaGFiaXRhdCwgd2hpY2ggaGFzIGl0cyBvd24gZGVwdGguIA0KV0hBVCBZT1UgRUFULCBBTkQgV0hFUkUgWU9VIEVBVCBhZmZlY3RzIHRoZSBjb3JyZWxhdGlvbiBiZXR3ZWVuIHByZWRhdG9yIGFuZCBwcmV5IG1hc3MuIA0KR0xNOiBsb29rIGF0IGludGVyYWN0aW9ucyBiZXR3ZWVuIHNwZWNpZmljIGhhYml0YXQsIHR5cGUgb2YgZmVlZGluZyBpbnRlcmFjdGlvbnM/PyANCk9ubHkgd2hlbiB3ZSBsb29rZWQgYXQgZ2VuZXJhbGlzdCBlYXRlcnMgZGlkIGhhYml0YXQNCg0KIyBQcmVkYXRvci1wcmV5IGJvZHkgbWFzcyByYXRpb3MgDQoNCmBgYHtyfQ0KDQojIHByZWRfcHJleV9kYXRhc2V0ICU+JQ0KIyAgICAgbXV0YXRlKFBQTVIgPSBtZWFuKFByZWRhdG9yX21hc3MvUHJleV9tYXNzKSkgJT4lIA0KIyAgICAgZ3JvdXBfYnkoU3BlY2lmaWNfaGFiaXRhdCwgUFBNUikgJT4lIA0KIyAgICAgc2VsZWN0KCkgJT4lIA0KIyAgICAgZ2dwbG90KGFlcyh4ID0gU3BlY2lmaWNfaGFiaXRhdCwgeSA9IGxvZyhQUE1SKSkpICsNCiMgICAgIGdlb21fY29sKCkgKw0KIyAgICAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGU9LTQ1LCBoanVzdD0wLCB2anVzdD0xKSkgDQoNCiMgTm90IHJlYWxseSBzdXJlIGlmIHRoaXMgdGVsbHMgdXMgYW55dGhpbmcgLS0gSSB0aGluayBpdCBnaXZlcyB1cyB0aGUgc2FtZSBpbmZvcm1hdGlvbiBhcyB0aGUgc2xvcGUgDQoNCiMgZ2dzYXZlKCJwcmVkYXRvciBwcmV5IHJhdGlvLmpwZyIsIHdpZHRoID0gMTUsIGhlaWdodCA9IDEwLCB1bml0cyA9ICJjbSIpDQpgYGANCg0KIyBPS0FZIFBST0pFQ1QgDQoNCg0KUXVlc3Rpb246IEhvdyBkbyBzcGVjaWZpYyBoYWJpdGF0cyBhZmZlY3QgcHJlZGF0b3ItcHJleSBib2R5IHNpemUgcmVsYXRpb25zaGlwcz8gKHNwZWNpZmljYWxseSwgaG93IGRvZXMgaXQgYWZmZWN0IGxvZyBwcmV5IG1hc3MgKGRlcGVuZGVudCB2YXJpYWJsZSkpDQotIEluIG90aGVyIHdvcmRzLCB3aGVuIGxvZyBwcmVkYXRvciBtYXNzIGFuZCBsb2cgcHJleSBtYXNzIGFyZSBwbG90dGVkLCB3aGF0IGV4cGxhaW5zIHRoZSB2YXJpYXRpb24gaW4gc3RyZW5ndGggb2YgdGhlIHNsb3BlPyANCi0gSXMgdGhlcmUgYW4gaW50ZXJhY3Rpb24gZWZmZWN0IHdpdGggZmVlZGluZyB0eXBlPyBXaXRoIHByZWRhdG9yIG1hc3M/DQoNCiMgUHJlZGF0b3ItcHJleSByZWxhdGlvbnNoaXBzIA0KDQpTYW1lIGdyYXBocyBhZ2FpbjogDQpgYGB7cn0NCnByZWRfcHJleV9kYXRhc2V0ICU+JSANCiAgICBnZ3Bsb3QoYWVzKHggPSBsb2coUHJlZGF0b3JfbWFzcyksIHkgPSBsb2coUHJleV9tYXNzKSwgY29sb3VyID0gU3BlY2lmaWNfaGFiaXRhdCkpICsNCiAgICBnZW9tX3BvaW50KHNpemUgPSAwLjMpIA0KDQpwcmVkX3ByZXlfZGF0YXNldCAlPiUgDQogICAgZ2dwbG90KGFlcyh4ID0gbG9nKFByZWRhdG9yX21hc3MpLCB5ID0gbG9nKFByZXlfbWFzcyksIGNvbG91ciA9IFR5cGVfb2ZfZmVlZGluZ19pbnRlcmFjdGlvbikpICsNCiAgICBnZW9tX3BvaW50KHNpemUgPSAwLjMpIA0KDQojIFByZXkgbWFzcyA9IGRlcGVuZGVudCB2YXJpYWJsZQ0KDQojIFByZWRhdG9yIG1hc3MgPSBpbmRlcGVuZGVudCB2YXJpYWJsZTogQnJvc2UgZXQgYWwuIDIwMTAgdXNlIFByZWRhdG9yIG1hc3MgYXMgdGhlIGluZGVwZW5kZW50IHZhcmlhYmxlIGJlY2F1c2UgdGhlcmUgaXMgbGVzcyBlcnJvciBpbiBpdCB0aGFuIHByZXkgbWFzcyAocHJleSBhcmUgdXN1YWxseSByZW1vdmVkIGZyb20gcHJlZGF0b3IgZ3V0cywgc29tZXRpbWVzIGhhcmQgdG8gaWRlbnRpZnkgZXhhY3Qgc3BlY2llcykNCg0KIyBhcmUgdGhlcmUgb3RoZXIgaW5kZXBlbmRlbnQgdmFyaWFibGVzPyBkbyB0aGV5IGludGVyYWN0Pw0KDQojIFF1ZXN0aW9uOiBob3cgZG8geW91IGFkZCBhIDE6MSBsaW5lPw0KDQojIGZpdCBzb21lIG1vZGVscyB0byB0aGlzIGdyYXBoOiBtaXhlZCBlZmZlY3RzLCBBSUMNCmBgYA0KDQpgYGB7cn0NCnByZWRfcHJleV9kYXRhc2V0ICU+JSANCiAgICBncm91cF9ieShUeXBlX29mX2ZlZWRpbmdfaW50ZXJhY3Rpb24pICU+JSANCiAgICB0YWxseSgpDQoNCnByZWRfcHJleV9kYXRhc2V0ICU+JSANCiAgICBncm91cF9ieShTcGVjaWZpY19oYWJpdGF0KSAlPiUgDQogICAgdGFsbHkoKQ0KDQojIEkgZG9uJ3QgdGhpbmsgd2UgbmVlZCB0byB3b3JyeSBhYm91dCB0aGUgbGlmZXN0YWdlcyBvZiBwcmVkYXRvcnMgYmVjYXVhc2UgaW4gdGhlIGRhdGFzZXQgaXQgZGlzdGluZ3Vpc2hlcyBiZXR3ZWVuIHdoYXQgdGhlIHByZWRhdG9yIGVhdHMgZGVwZW5kaW5nIG9uIGl0cyBsaWZlc3RhZ2UNCmBgYA0KDQpgYGB7cn0NCmZpbHRlcmVkX2RhdGFzZXQgPC0gcHJlZF9wcmV5X2RhdGFzZXQgJT4lIA0KICAgIGZpbHRlcihUeXBlX29mX2ZlZWRpbmdfaW50ZXJhY3Rpb24gIT0gJ2luc2VjdGl2b3JvdXMnICYgVHlwZV9vZl9mZWVkaW5nX2ludGVyYWN0aW9uICE9ICdwcmVkYWNpb3VzL3Bpc2Npdm9yb3VzJykgJT4lIA0KICAgIGZpbHRlcihTcGVjaWZpY19oYWJpdGF0ICE9ICdDb2FzdGFsLCBTVyAmIFNFIEdyZWVubGFuZCcgJiBTcGVjaWZpY19oYWJpdGF0ICE9ICdpbnNob3JlJyAmIFNwZWNpZmljX2hhYml0YXQgIT0gJ05lYXJzaG9yZSB3YXRlcnMnKQ0KDQpmaWx0ZXJlZF9kYXRhc2V0IA0KYGBgDQoNCg0KDQpgYGB7ciwgZmlnLmhlaWdodD01LCBmaWcud2lkdGg9MTV9DQpwcmVkX3ByZXlfZGF0YXNldCAlPiUgDQogICAgZ2dwbG90KGFlcyh4ID0gbG9nKFByZWRhdG9yX21hc3MpLCB5ID0gbG9nKFByZXlfbWFzcyksIGNvbG91ciA9IEdlb2dyYXBoaWNfbG9jYXRpb24pKSArDQogICAgZ2VvbV9wb2ludChzaXplID0gMC4xKSArDQogICAgZmFjZXRfd3JhcCh+IFNwZWNpZmljX2hhYml0YXQpICsNCiAgICBnZW9tX3Ntb290aChtZXRob2QgPSAnZ2xtJywgY29sb3VyID0gJ2JsYWNrJykNCg0KIyBJIHRoaW5rIHRoZSBzbG9wZSBtaWdodCB0ZWxsIHlvdSBhYm91dCB0aGUgcmFuZ2Ugb2YgYm9keSBzaXplcywgYXMgd2VsbCBhcyBob3cgcHJleSBib2R5IG1hc3MgY2hhbmdlcyB3aXRoIHByZWRhdG9yIGJvZHkgbWFzcyBpbiBkaWZmZXJlbnQgaGFiaXRhdHMNCmBgYA0KDQpgYGB7cn0NCnByZWRfcHJleV9kYXRhc2V0ICU+JQ0KICAgIGdncGxvdChhZXMoeCA9IGxvZyhQcmVkYXRvcl9tYXNzKSwgeSA9IGxvZyhQcmV5X21hc3MpLCBjb2xvdXIgPSBUeXBlX29mX2ZlZWRpbmdfaW50ZXJhY3Rpb24pKSArDQogICAgZ2VvbV9wb2ludChzaXplID0gMC4xKSArDQogICAgZmFjZXRfd3JhcCh+IFR5cGVfb2ZfZmVlZGluZ19pbnRlcmFjdGlvbikgKw0KICAgIGdlb21fc21vb3RoKG1ldGhvZCA9ICdnbG0nLCBjb2xvdXIgPSAnYmxhY2snKQ0KYGBgDQoNCiMgTW9kZWwgDQoNCmBgYHtyfQ0KbGlicmFyeShsbWU0KQ0KYGBgDQoNCmBgYHtyfQ0KZmlsdGVyZWRfZGF0YXNldCA8LSBQcmVkDQpgYGANCg0KDQojIExpbmVhciBtb2RlbCAxDQoNClRoaXMgbW9kZWwgc2F5czogVGhhdCBmb3IgZXZlcnkgaGFiaXRhdCwgcHJlZGF0b3IgYW5kIHByZXkgbWFzcyByZWxhdGlvbnNoaXBzIGhhdmUgYSBkaWZmZXJlbnQgaW50ZXJjZXB0IChkaWZmZXJlbnQgc3RhcnRpbmcgcG9pbnQpLCBhbmQgdGhlIGVmZmVjdCBpcyBoYXMgb24gdGhlIHNsb3BlIG9mIHRoZSByZWxhdGlvbnNoaXAgaXMgYWxzbyBkaWZmZXJlbnQgaW4gZXZlcnkgaGFiaXRhdC4NCkRpZmZlcmVudCBzbG9wZSBhbmQgaW50ZXJjZXB0IGZvciBoYWJpdGF0Lg0KDQpgYGB7cn0NCmxtMSA8LSBsbWVyKGxvZyhQcmV5X21hc3MpIH4gDQogICAgICAgICAgICAgICAgbG9nKFByZWRhdG9yX21hc3MpICsgDQogICAgICAgICAgICAgICAgKDEgKyBsb2coUHJlZGF0b3JfbWFzcyl8U3BlY2lmaWNfaGFiaXRhdCksIA0KICAgICAgICAgICAgZGF0YSA9IGZpbHRlcmVkX2RhdGFzZXQpDQoNCnN1bW1hcnkobG0xKQ0KcmFuZWYobG0xKQ0KdGlkeShsbTEsY29uZi5pbnQgPSBUKQ0KDQpgYGANCg0KIyBMaW5lYXIgbW9kZWwgMg0KDQpBc3N1bWluZyBkaWZmZXJlbnQgc2xvcGVzIGFuZCBpbnRlcmNlcHRzIGZvciBkaWZmZXJlbnQgaGFiaXRhdHMgYW5kIGZlZWRpbmcgdHlwZXMuDQoNCmBgYHtyfQ0KbG0yIDwtIGxtZXIobG9nKFByZXlfbWFzcykgfiBsb2coUHJlZGF0b3JfbWFzcykgKyAoMSArIGxvZyhQcmVkYXRvcl9tYXNzKXxTcGVjaWZpY19oYWJpdGF0KSArICgxICsgbG9nKFByZWRhdG9yX21hc3MpfFR5cGVfb2ZfZmVlZGluZ19pbnRlcmFjdGlvbiksIGRhdGEgPSBmaWx0ZXJlZF9kYXRhc2V0KQ0KDQpzdW1tYXJ5KGxtMikNCnJhbmVmKGxtMikNCnRpZHkobG0yLGNvbmYuaW50ID0gVCkNCmZpdHRlZF9sbTIgPC0gYXVnbWVudChsbTIpIA0KZ2dwbG90KGZpdHRlZF9sbTIsIGFlcyh4ID0gbG9nLlByZWRhdG9yX21hc3MuLCB5ID0gLmZpeGVkLCBjb2xvdXIgPSBTcGVjaWZpY19oYWJpdGF0KSkgKw0KICAgIGdlb21fbGluZSgpIA0KYGBgDQoNCg0KIyBMaW5lYXIgbW9kZWwgNA0KDQpBc3N1bWUgZGlmZmVyZW50IGludGVyY2VwdHMgYW5kIHNsb3BlIGZvciBldmVyeSBmZWVkaW5nIHR5cGUuIA0KDQpgYGB7cn0NCmxtNCA8LSBsbWVyKGxvZyhQcmV5X21hc3MpIH4gDQogICAgICAgICAgICAgICAgbG9nKFByZWRhdG9yX21hc3MpICsgDQogICAgICAgICAgICAgICAgKDEgKyBsb2coUHJlZGF0b3JfbWFzcyl8VHlwZV9vZl9mZWVkaW5nX2ludGVyYWN0aW9uKSwgZGF0YSA9IGZpbHRlcmVkX2RhdGFzZXQpDQpzdW1tYXJ5KGxtNCkNCnJhbmVmKGxtNCkNCnRpZHkobG00LGNvbmYuaW50ID0gVCkNCmBgYA0KDQoNCg0KUG9zc2libGUgaW50ZXJhY3Rpb24gZWZmZWN0IGZvciBoYWJpdGF0IGFuZCBmZWVkaW5nIHR5cGUuIEluIG1vZGVsIDcsIHRoZSBzbG9wZSBpcyBhZmZlY3RlZCBieSB0aGUgaW50ZXJhY3Rpb24gYnR3ZWVuIGhhYml0YXQgdHlwZSBhbmQgZmVlZGluZyB0eXBlLiANCg0KYGBge3J9DQojICNsaWJyYXJ5KGxtZTQpDQojIA0KIyAjc3VtbWFyeShsbTcpDQojIHJhbmVmKGxtNykNCiMgdGlkeShsbTcsY29uZi5pbnQgPSBUKQ0KIyBmaXR0ZWRfbG03IDwtIGF1Z21lbnQobG03KSANCiMgbmFtZXMoZml0dGVkX2xtNykNCiMgICAgIGdncGxvdChmaXR0ZWRfbG03LCBhZXMoeCA9IGxvZy5QcmVkYXRvcl9tYXNzLiwgeSA9IC5maXhlZCwgY29sb3VyID0gU3BlY2lmaWNfaGFiaXRhdCkpICsNCiMgICAgIGdlb21fbGluZSgpICMrDQojICAgICAgICAgI2ZhY2V0X2dyaWQofiBTcGVjaWZpY19oYWJpdGF0KQ0KYGBgDQoNCg0KIyBBSUMNCg0KYGBge3J9DQpsaWJyYXJ5KE11TUluKQ0KYGBgDQoNCmBgYHtyfQ0KI21vZGVsLnNlbChsbTEsIGxtMiwgbG00LCBsbTksIGxtMTAsIGxtMTEsbnVsbCwgbG0xMiwgcmFuayA9IEFJQykNCmBgYA0KDQpUYWtlIG91dCBtb2RlbCA1IC0tIGFzc3VtcHRpb24gZG9lbnMndCBtYWtlIHNlbnNlLiANCg0KYGBge3J9DQpsbTkgPC0gbG1lcihsb2coUHJleV9tYXNzKSB+IGxvZyhQcmVkYXRvcl9tYXNzKSArICgxIHwgVHlwZV9vZl9mZWVkaW5nX2ludGVyYWN0aW9uKSArICgxIHwgVHlwZV9vZl9mZWVkaW5nX2ludGVyYWN0aW9uOlNwZWNpZmljX2hhYml0YXQpLCBkYXRhID0gZmlsdGVyZWRfZGF0YXNldCkNCg0KbG0xMCA8LSBsbWVyKGxvZyhQcmV5X21hc3MpIH4gbG9nKFByZWRhdG9yX21hc3MpICsgKDEgKyBsb2coUHJlZGF0b3JfbWFzcykgfCBUeXBlX29mX2ZlZWRpbmdfaW50ZXJhY3Rpb24pICsgKDEgKyBsb2coUHJlZGF0b3JfbWFzcyl8IFR5cGVfb2ZfZmVlZGluZ19pbnRlcmFjdGlvbjpTcGVjaWZpY19oYWJpdGF0KSwgZGF0YSA9IGZpbHRlcmVkX2RhdGFzZXQpDQpgYGANCg0KDQoNCmBgYHtyfQ0KbG0xMSA8LSBsbWVyKGxvZyhQcmV5X21hc3MpIH4gbG9nKFByZWRhdG9yX21hc3MpICsgKDEgKyBsb2coUHJlZGF0b3JfbWFzcykgfCBTcGVjaWZpY19oYWJpdGF0KSArICgxICsgbG9nKFByZWRhdG9yX21hc3MpfCBTcGVjaWZpY19oYWJpdGF0OlR5cGVfb2ZfZmVlZGluZ19pbnRlcmFjdGlvbiksIGRhdGEgPSBmaWx0ZXJlZF9kYXRhc2V0KQ0KDQpgYGANCg0KDQoNCmBgYHtyfQ0KIyBmaXR0ZWRfbG0xMSA8LSBhdWdtZW50KGxtMTEpIA0KIyBmaXR0ZWRfbG0xMQ0KIyAgICAgZ2dwbG90KG51bGxsbTExLCBhZXMoeCA9IGxvZy5QcmVkYXRvcl9tYXNzLiwgeSA9IC5maXR0ZWQpKSArDQojICAgICBnZW9tX2xpbmUoYWVzKGNvbG91ciA9IFNwZWNpZmljX2hhYml0YXQpKStmYWNldF9ncmlkKH4gVHlwZV9vZl9mZWVkaW5nX2ludGVyYWN0aW9uKSArIG51bGxfbGluZQ0KIyANCg0KI01PVkVEIFRISVMgQ09ERSBUTyBUSEUgQk9UVE9NIEJFQ0FVU0UgTlVMTGxtMTEgaXMgYXQgYm90dG9tDQogICAgYGBgDQoNCmBgYHtyfQ0KDQojIGZpdGRhdGExMSA8LSByYW5lZihsbTExKVtbMV1dICU+JSANCiMgICAgIHJvd25hbWVzX3RvX2NvbHVtbigpJT4lIGFzX2RhdGFfZnJhbWUoKSAlPiUgDQojICAgICBzZXBhcmF0ZShyb3duYW1lLCBpbnRvID0gYygiaGFiaXRhdCIsImZlZWRpbmdfdHlwZSIpLCBzZXAgPSAiOiIpIA0KIyBjb2xuYW1lcyhmaXRkYXRhMTEpWzRdIDwtIGMoInNsb3BlIikNCiMgZml0ZGF0YTExICU+JSANCiMgICAgIGdncGxvdCgpKw0KIyAgICAgZ2VvbV9wb2ludChhZXMoeCA9IGZlZWRpbmdfdHlwZSwgeSA9IGZpeGVmKGxtMTEpW1syXV0gKyBzbG9wZSxjb2xvciA9IGhhYml0YXQpICkgKyANCiMgICAgIGdlb21faGxpbmUoeWludGVyY2VwdCA9IHRpZHkobnVsbClbMiwyXSkNCmBgYA0KDQoNCg0KDQpgYGB7cn0NCmxtMTIgPC0gbG1lcihsb2coUHJleV9tYXNzKSB+IGxvZyhQcmVkYXRvcl9tYXNzKSArICgxICsgbG9nKFByZWRhdG9yX21hc3MpIHwgU3BlY2lmaWNfaGFiaXRhdCkgKyAoMSArIGxvZyhQcmVkYXRvcl9tYXNzKXwgU3BlY2lmaWNfaGFiaXRhdDpUeXBlX29mX2ZlZWRpbmdfaW50ZXJhY3Rpb24pICsgKDEgKyBsb2coUHJlZGF0b3JfbWFzcyl8IFR5cGVfb2ZfZmVlZGluZ19pbnRlcmFjdGlvbiksIGRhdGEgPSBmaWx0ZXJlZF9kYXRhc2V0KQ0KYGBgDQoNCmBgYHtyfQ0KIyANCiMgZml0ZGF0YTEyIDwtIHJhbmVmKGxtMTIpW1sxXV0gJT4lIA0KIyAgICAgcm93bmFtZXNfdG9fY29sdW1uKCklPiUgYXNfZGF0YV9mcmFtZSgpICU+JSANCiMgICAgIHNlcGFyYXRlKHJvd25hbWUsIGludG8gPSBjKCJoYWJpdGF0IiwiZmVlZGluZ190eXBlIiksIHNlcCA9ICI6IikgDQojIGNvbG5hbWVzKGZpdGRhdGExMilbNF0gPC0gYygic2xvcGUiKQ0KIyBmaXRkYXRhMTIgJT4lIA0KIyAgICAgZ2dwbG90KCkrDQojICAgICBnZW9tX3BvaW50KGFlcyh4ID0gZmVlZGluZ190eXBlLCB5ID0gZml4ZWYobG0xMilbWzJdXSArIHNsb3BlLGNvbG9yID0gaGFiaXRhdCkgKSArIA0KIyAgICAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gdGlkeShudWxsKVsyLDJdKQ0KYGBgDQoNCg0KYGBge3J9DQojbW9kZWwuc2VsKGxtMSwgbG0yLCBsbTQsIGxtOSwgbG0xMCwgbG0xMSxudWxsLCBsbTEyLCByYW5rID0gQUlDKQ0KYGBgDQoNCg0KYGBge3J9DQojYW5vdmEobG0xLCBsbTIsIGxtNCwgbG05LCBsbTEwLCBsbTExLG51bGwsIGxtMTIpDQpgYGANCg0KYGBge3J9DQojYW5vdmEoIGxtOSwgbG0xMCwgbG0xMSwgbG0xMikNCmBgYA0KDQoNCmBgYHtyfQ0KZml0dGVkX2xtMTEgPC0gYXVnbWVudChsbTExKSANCg0KDQpgYGANCg0KDQpgYGB7cn0NCg0KbnVsbCA8LSBnbG0obG9nKFByZXlfbWFzcykgfiBsb2coUHJlZGF0b3JfbWFzcyksZGF0YSA9IGZpbHRlcmVkX2RhdGFzZXQpIA0KZml0dGVkX251bGwgPC0gYXVnbWVudChudWxsKSAlPiUgDQogICAgcmVuYW1lKC5maXR0ZWRfbnVsbCA9IC5maXR0ZWQpDQpuYW1lcyhmaXR0ZWRfbnVsbCkNCm51bGxfbGluZSA8LSBnZW9tX2xpbmUoYWVzKHggPSBsb2cuUHJlZGF0b3JfbWFzcy4sIHkgPSAuZml0dGVkX251bGwpKQ0KbnVsbGxtMTEgPC0gYmluZF9jb2xzKGZpdHRlZF9sbTExLCBmaXR0ZWRfbnVsbCkNCg0KYGBgDQoNCg0KYGBge3J9DQpmaXR0ZWRfbG0xMQ0KICAgIGdncGxvdChudWxsbG0xMSwgYWVzKHggPSBsb2cuUHJlZGF0b3JfbWFzcy4sIHkgPSAuZml0dGVkKSkgKw0KICAgIGdlb21fbGluZShhZXMoY29sb3VyID0gU3BlY2lmaWNfaGFiaXRhdCkpK2ZhY2V0X2dyaWQofiBUeXBlX29mX2ZlZWRpbmdfaW50ZXJhY3Rpb24pICsgbnVsbF9saW5lDQpgYGANCg0KDQoNCmBgYHtyfQ0KDQpmaXRkYXRhMTEgPC0gcmFuZWYobG0xMSlbWzFdXSAlPiUgDQogICAgcm93bmFtZXNfdG9fY29sdW1uKCklPiUgYXNfZGF0YV9mcmFtZSgpICU+JSANCiAgICBzZXBhcmF0ZShyb3duYW1lLCBpbnRvID0gYygiaGFiaXRhdCIsImZlZWRpbmdfdHlwZSIpLCBzZXAgPSAiOiIpIA0KY29sbmFtZXMoZml0ZGF0YTExKVs0XSA8LSBjKCJzbG9wZSIpDQpmaXRkYXRhMTEgJT4lIA0KICAgIGdncGxvdCgpKw0KICAgIGdlb21fcG9pbnQoYWVzKHggPSBmZWVkaW5nX3R5cGUsIHkgPSBmaXhlZihsbTExKVtbMl1dICsgc2xvcGUsY29sb3IgPSBoYWJpdGF0KSApICsgDQogICAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gdGlkeShudWxsKVsyLDJdKQ0KYGBgDQoNCg0KYGBge3J9DQpmaXRkYXRhMTIgPC0gcmFuZWYobG0xMilbWzFdXSAlPiUgDQogICAgcm93bmFtZXNfdG9fY29sdW1uKCklPiUgYXNfZGF0YV9mcmFtZSgpICU+JSANCiAgICBzZXBhcmF0ZShyb3duYW1lLCBpbnRvID0gYygiaGFiaXRhdCIsImZlZWRpbmdfdHlwZSIpLCBzZXAgPSAiOiIpIA0KY29sbmFtZXMoZml0ZGF0YTEyKVs0XSA8LSBjKCJzbG9wZSIpDQpmaXRkYXRhMTIgJT4lIA0KICAgIGdncGxvdCgpKw0KICAgIGdlb21fcG9pbnQoYWVzKHggPSBmZWVkaW5nX3R5cGUsIHkgPSBmaXhlZihsbTEyKVtbMl1dICsgc2xvcGUsY29sb3IgPSBoYWJpdGF0KSApICsgDQogICAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gdGlkeShudWxsKVsyLDJdKQ0KYGBgDQoNCmBgYHtyfQ0KbW9kZWwuc2VsKGxtMSwgbG0yLCBsbTQsIGxtOSwgbG0xMCwgbG0xMSxudWxsLCBsbTEyLCByYW5rID0gQUlDKQ0KYGBgDQoNCmBgYHtyfQ0KI2Fub3ZhKGxtMSwgbG0yLCBsbTQsIGxtOSwgbG0xMCwgbG0xMSxudWxsLCBsbTEyKQ0KYGBgDQoNCg0KYGBge3J9DQphbm92YSggbG05LCBsbTEwLCBsbTExLCBsbTEyKQ0KYGBgDQoNCg==